/**
 * 导航组件
 * 管理侧边栏导航和工具切换功能
 */

const { TOOLS_CONFIG } = require('../config/app-config');

class Navigation {
    constructor() {
        this.sidebar = null;
        this.toggleButton = null;
        this.navItems = null;
        this.toolPanels = null;
        this.currentTool = 'geocoding'; // 默认工具
        
        // 立即初始化，由主应用统一管理初始化时机
        setTimeout(() => this.init(), 100);
    }

    /**
     * 初始化导航功能
     */
    init() {
        this.sidebar = document.getElementById('sidebar');
        this.toggleButton = document.getElementById('toggleSidebar');
        this.navItems = document.querySelectorAll('.nav-item:not(.disabled)');
        this.toolPanels = document.querySelectorAll('.tool-panel');
        
        this.bindEvents();
        this.setActiveTool(this.currentTool);
    }

    /**
     * 绑定事件监听器
     */
    bindEvents() {
        // 侧边栏切换按钮
        if (this.toggleButton) {
            this.toggleButton.addEventListener('click', () => this.toggleSidebar());
        }

        // 导航项点击事件
        this.navItems.forEach(item => {
            item.addEventListener('click', (e) => {
                const toolId = item.dataset.tool;
                if (toolId && TOOLS_CONFIG[toolId]?.enabled) {
                    this.switchTool(toolId);
                    this.setActiveNavItem(item);
                }
            });
        });

        // 键盘快捷键支持
        document.addEventListener('keydown', (e) => {
            if (e.ctrlKey && e.key === 'b') {
                e.preventDefault();
                this.toggleSidebar();
            }
        });
    }

    /**
     * 切换侧边栏显示/隐藏
     */
    toggleSidebar() {
        if (this.sidebar) {
            this.sidebar.classList.toggle('hidden');
            
            // 保存侧边栏状态到本地存储
            const isHidden = this.sidebar.classList.contains('hidden');
            localStorage.setItem('sidebar-hidden', isHidden);
        }
    }

    /**
     * 切换工具
     * @param {string} toolId - 工具ID
     */
    switchTool(toolId) {
        if (!TOOLS_CONFIG[toolId] || !TOOLS_CONFIG[toolId].enabled) {
            console.warn(`工具 ${toolId} 不存在或未启用`);
            return;
        }

        // 隐藏所有工具面板
        this.toolPanels.forEach(panel => {
            panel.classList.remove('active');
        });

        // 显示选中的工具面板
        const targetPanel = document.getElementById(`tool-${toolId}`);
        if (targetPanel) {
            targetPanel.classList.add('active');
            this.currentTool = toolId;
            
            // 触发工具切换事件
            this.dispatchToolChangeEvent(toolId);
        }
    }

    /**
     * 设置活跃的导航项
     * @param {HTMLElement} activeItem - 活跃的导航项
     */
    setActiveNavItem(activeItem) {
        // 移除所有活跃状态
        this.navItems.forEach(item => {
            item.classList.remove('active');
        });

        // 设置当前项为活跃状态
        if (activeItem) {
            activeItem.classList.add('active');
        }
    }

    /**
     * 根据工具ID设置活跃工具
     * @param {string} toolId - 工具ID
     */
    setActiveTool(toolId) {
        // 切换工具面板
        this.switchTool(toolId);

        // 设置对应的导航项为活跃状态
        const navItem = document.querySelector(`[data-tool="${toolId}"]`);
        if (navItem) {
            this.setActiveNavItem(navItem);
        }
    }

    /**
     * 触发工具切换事件
     * @param {string} toolId - 工具ID
     */
    dispatchToolChangeEvent(toolId) {
        const event = new CustomEvent('toolChange', {
            detail: {
                toolId: toolId,
                toolConfig: TOOLS_CONFIG[toolId]
            }
        });
        document.dispatchEvent(event);
    }

    /**
     * 恢复侧边栏状态
     */
    restoreSidebarState() {
        const isHidden = localStorage.getItem('sidebar-hidden') === 'true';
        if (isHidden && this.sidebar) {
            this.sidebar.classList.add('hidden');
        }
    }

    /**
     * 获取当前工具ID
     * @returns {string} 当前工具ID
     */
    getCurrentTool() {
        return this.currentTool;
    }

    /**
     * 添加新的导航项
     * @param {Object} toolConfig - 工具配置
     */
    addNavItem(toolConfig) {
        // 这里可以动态添加新的导航项
        // 为未来的动态工具加载功能预留
        console.log('添加导航项:', toolConfig);
    }
}

module.exports = Navigation;